#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Name : __init__.py
# Author: ls_seraph@126.com
# Time  : 2021/3/6 22:46

import os
from frame.common.global_data.path_param import Param
from frame.common.util.config_util import config as yml

import unittest
from frame.common import suite_run
from frame.common.util.zip_utils import zip_dir
from frame.common.util.email_utils import EmailUtils
from frame.common.util.log_utils import logger as log
from frame.common.util.file_util import ReportDirectory
from frame.common.html_report_cn import HTMLTestReport


class RunTask():
    """
    任务启动类
    """

    def __init__(self, case_path, task_name, description):
        self.task_name = task_name
        # 任务路径
        self.test_case_path = case_path
        # 测报告路径
        self.report_title = yml.get_report_value("title")
        self.tester = yml.get_default_value("tester")

        self.description = description

    # 正常启动
    def start(self, is_send_mail=False):
        suite = self.create_suite(self.test_case_path)
        self.execute_case(suite)
        if is_send_mail:
            self.send_mail(Param.get_value('dir_path'))

        log.info("自动化执行完毕！")
        log.info("报告路径：%s" % os.path.abspath(Param.get_value("report_path")))

    # 执行用例
    def execute_case(self, suite):
        """
        :param suite: 所要执行的用例集
        :return dir_path: 报告目录
        """
        # 设置一个html的空文件
        self.create_report(self.task_name)

        # 装配测试报告
        runner = suite_run.TestRunner(title=self.report_title, description=self.description, tester=self.tester)
        # 执行
        result = runner.run(suite)
        fp = open(Param.get_value('report_path'), 'w', encoding="utf-8")
        # 生成测试报告
        html = HTMLTestReport(title="执行测试报告", description="测试说明", tester="执行人").generateReport(result)
        fp.write(html)
        fp.close()

    # 创建报告
    def create_report(self, task_name):
        """
        配置报告 创建文件夹 报告路径\n
        :return fp: 新建HTML的stream流文件
        """
        # 创建文件夹
        dir_path = ReportDirectory().create_dir(task_name)
        # 报告文件夹路径 存入全局变量
        Param.set_value("dir_path", dir_path)
        # 测试报告路径 存入全局变量
        Param.set_value("report_path", os.path.join(dir_path, ReportDirectory().report_name_format()))

    # 创建用例集
    def create_suite(self, test_case_path):
        """
        创建用例集\n
        :param test_case_path: 所要查找的用例路径
        :return: suite 用例集
        """
        # 创建用例集
        suite = unittest.TestSuite()
        # 装载所需用例
        # start_dir 用例文件夹路径
        # pattern   用例文件格式
        discover = unittest.defaultTestLoader.discover(
            start_dir=test_case_path,
            pattern='*_test.py')
        log.info("需要执行用例【{0}】个".format(discover.countTestCases()))
        suite.addTest(discover)
        return suite

    # 发送邮件
    def send_mail(self, dir_path):
        """
        发送邮件\n
        :param dir_path:文件夹路径
        :return:
        """
        email_report_path = dir_path + '/../自动化测试报告.zip'
        zip_dir(dir_path, email_report_path)
        em = EmailUtils('python自动化测试报告', smtp_file_path=email_report_path)
        msg = em.mail_content()
        em.send_mail(msg)
